/******************************************************************************************
 * Import
 ******************************************************************************************/

// module
import _ from 'lodash';
import {Storage, Session, Time, Gen} from '../../library';
import {Config} from '../../preset';

/******************************************************************************************
 * Export Class
 ******************************************************************************************/

export default class Auth {

    /*------------------------------------------------------------------------------------
	 * 外部调用接口
	 *-----------------------------------------------------------------------------------*/
    /**
     * App启动调用
     */
    static startup() {
        
        // 获取auth信息
        Storage.get({
            key: 'profile_auth',

            // 用户从没来过，生成新的数据分别给Storage和Session
            empty: ()=> {
                this._arriveAnonym();
            },

            // 用户来过
            success: (res)=> {
                this._arriveLogin(res);
            }
        });
    }

    /**
     * 登录成功
     * 
     * @param {Object} auth 必须包含：token，uid
     */
    static login(auth) {
        this._actionLogin(auth);
    }

    /**
     * 退出登录
     */
    static logout() {
        this._actionLogout();
    }

    /**
     * 判断用户是否已经登录
     * 
     * @return {Boolean} 已经登录返回true，否则返回false
     */
    static isLogin() {
        let session = Session.get('profile_auth');
        if (_.isObject(session) && !_.isNil(session.uid)) {
            if (parseInt(session.uid) > 0) {
                return true;
            }
        }
        return false;
    }

    /*------------------------------------------------------------------------------------
	 * 到达处理器方法
	 *-----------------------------------------------------------------------------------*/
    /**
     * 首次到达（全新）用户到达处理器
     */
    static _arriveAnonym() {

        // 制作auth基本对象，带有token, uid
        const auth = {
            token: Time.get13() + Gen.mixed(3),
            uid: 0
        };

        // 将auth存入session
        Session.set('profile_auth', Object.assign(auth, Config.app));

        // 将auth存入storage
        Storage.set({
            key: 'profile_auth',
            value: auth
        });
    }

    /**
     * 非第一次到达的用户处理器，将auth存入session
     */
    static _arriveLogin(auth) {

        // 如果auth为string（从Storage传递而来）
        // 将其转换为json，
        // 如果转换不了，则调用“匿名访问函数处理器”
        if (_.isString(auth)) {
            if (typeof JSON.parse(auth) == "object") {
                auth = JSON.parse(auth);
            }
            this._arriveAnonym(); 
            return;
        }

        // 验证成功，存入session
        Session.set('profile_auth', Object.assign(JSON.parse(auth), Config.app));       
    }

    /*------------------------------------------------------------------------------------
	 * 动作处理器方法
	 *-----------------------------------------------------------------------------------*/
    static _actionLogin(auth) {

        // 将auth存入session
        Session.set('profile_auth', Object.assign(auth, Config.app));

        // 将auth存入storage
        Storage.set({
            key: 'profile_auth',
            value: auth
        });
    }

    /**
     * 退出登录动作
     */
    static _actionLogout() {
        this._arriveAnonym();
    }

    /*------------------------------------------------------------------------------------
	 * 获取属性的方法
	 *-----------------------------------------------------------------------------------*/
    // static _getArrive() {
    //     return Time.get13() + Gen.mixed(3);
    // }
}
